\documentclass[12pt,a4paper]{article}
\usepackage[dutch]{babel}	
\usepackage{graphicx}
\usepackage{fancyhdr}
\graphicspath{{images/}}

\usepackage[top=2cm, bottom=2cm]{geometry}
\author{Pleun Willemsen en  Walter Ebbers }
\title{Documentatie Enterprise Application \\ JEE }
\date{\today\\v1.0}

\begin{document}
\maketitle
\newpage
\tableofcontents
\newpage
\section*{Revisie geschiedenis}
\begin{tabular}{|p{2cm}|p{1cm}|p{6cm}|p{4cm}|}
\hline Datum & Versie & Omschrijving & Auteur \\ 
\hline 31-03-2012 & 0.1 & template gemaakt & Pleun Willemsen \\ 
\hline 31-03-2012 & 0.2 & Client-Servlet uitgewerkt & Pleun Willemsen \\ 
\hline 31-03-2012 & 0.3 & ontwikkelomgeving uitgebreid, EJB, JPA, persistence uitgewerkt,handleiding screenshots gemaakt, persoonlijke bevinding uitgewerkt & Walter Ebbers \\
\hline 4-1-2012 & 1.0 & Versie voor oplevering, type fouten gefixd & Pleun Willemsen \\
\hline
\end{tabular} 

\section*{Begrippen}
\begin{tabular}{|p{4cm}|p{9cm}|}
\hline Begrip & Uitgeschreven:  \\ 
\hline EA & Enterprise Application   \\ 
\hline JPA & Java Persistence Api \\  
\hline JEE & Java Enterprise Edition \\  
\hline EJB & Enterprise JavaBeans\\
\hline JAR & Java Archive bestand. \\
\hline 
\end{tabular} 
\newpage

\section{Inleiding}
Dit document is bedoelt ter verslaglegging van de opdracht JEE van Enterprise Application. In het verslag staan verschillende zaken zoals een analyse, de client uitleg, de server uitleg met de bijbehorende beans en onze persoonlijke bevindingen. 
Dit document is bedoelt ter verslaglegging van de opdracht JEE van Enterprise Application.

\subsection{Opdracht}
Het warenhuis “[S]Aktiehuis” wil zijn omzet vergroten met behulp van het internet en overweegt toepassing van een of meerdere middleware technologie\"en. Het bedrijf stelt zich voor informatie over haar producten te geven via internet en klanten in staat te stellen bestellingen te doen. Hiertoe heeft [S]Aktiehuis de prijzen van haar producten vastgelegd. Cli\"enten kunnen vragen om de prijslijst en krijgen deze dan aangeboden. Verder kunnen cli\"enten een bestelling plaatsen. Globaal gezien gaat dat als de afbeelding hieronder:\\\\
\includegraphics[scale=0.6]{opdracht}\\\\
Toelichting bij de berichten:
\begin{itemize}
\item Een klant kan bij het opvragen van een produktlijst eventueel een produktsoort opgeven om de selectie te beperken
\item Een klant geeft aan te willen bestellen. [S]Aktiehuis genereert een nieuw bestelNr. Je zou dit als een winkelwagentje voor deze sessie kunnen beschouwen. Identificatie van de klant vindt plaats door middel van zijn naam.
\item De klant bestelt een aantal produkten.
\item Te allen tijde kan de klant een overzicht krijgen van alles wat tot dan toe besteld is.
\item Als de bestelling naar tevredenheid is samengesteld, maakt de klant de bestelling definitief.

\end{itemize}


\newpage
\section{Analyse}
Eerst hebben we de keuze gemaakt om EJB 3.0 te gebruiken. Deze keuze is aangeraden door onze docent omdat vorige versies van EJB vol bugs zaten en veel te complex waren. Hieronder staat een architectuur zoals EJB voornamelijk gebruikt wordt. \\\\
\includegraphics[scale=0.6]{architectuur}\\
De EJB container leeft in een Glassfish Application Server. We hebben voor Glassfish gekozen omdat er veel informatie over te vinden is en zeer makkelijke te installeren en te implementeren in de Eclipse workspace.\\\\

\includegraphics[scale=0.5]{klasse}



\newpage
\section{Ontwikkelomgeving}
Voor deze opdracht hebben we een Glashfish server ge\"installeerd. In de configuratie hebben we een nieuwe datasource aangemaakt die verwijst naar onze MSSQL databaseserver uit de eerste opdracht van Distibuted Services.\\\\
Naast een databaseverbinding in de server moest er ook een message-driven bean queue en factory link aangemaakt worden. Deze twee connecties worden in de EJB container gebruikt om data over te versturen. Dit gebeurd via een message methode. De message die binnenkomt wordt na een begrijpelijk object omgezet en deze kan dan bijvoorbeeld weggeschreven worden na de database.\\\\
\includegraphics[scale=0.75]{jmsOnMessage}\\\\
In het bovenstaande voorbeeld wordt de binnenkomende message omgezet na een bestelling en die wordt dan via de EntityManager opgeslagen in de database.

\newpage
\section{Server - EJB Container}
We hebben gekozen voor een EJB 3.0 project met en daarin verschillende sessionbeans en een messagedrivenbean om de winkelwagen definitief te maken. De sessionbeans implementeren een interface die ook aan de client zijde aanwezig is (zie klassediagram hierboven).\\
De EJB container wordt als een JAR ge\"importeerd op de webserver.


\newpage
\subsection{JPA}
Voor de communicatie met de database hebben we JPA binnen de EJB geimplmenteerd. Met JPA is het mogelijk om met objecten tegen de database te praten. Doormiddel van het uitvoeren van een query komt er een resultaatlijst. Deze lijst is gevuld met items. Deze items zijn instanties van de entities die in het systeem zitten. Aan de hand van die entities kan er data bekeken worden.

\subsubsection{Voorbeeld}
Hier een stuk voorbeeld code van een JPA query:\\
\includegraphics[scale=0.75]{jpa_voorbeeld}\\
De bovenstaande methode wordt gebruikt om in te loggen. In de query wordt een gebruikersnaam opgegeven en wordt er gekeken of deze persoon bestaat. Als de persoon gevonden is dan wordt er true terug gegeven en wordt er ingelogd en anders wordt er false terug gegeven. Bij false moet de gebruiker de gebruikersnaam opnieuw invoeren.


\subsection{Persistence.xml}
De persistence.xml wordt gebruikt voor de entitie klasses en voor de database verbinding. 
\subsubsection{Voorbeeld}
\includegraphics[scale=0.75]{pers_xml}\\
De database verbinding wordt gehaald vanuit de link die gelegd is op de server. 

\newpage
\section{Client - Servlets}
%Servlets -> objecten only getters setters
Aan de client zijde hebben we een aantal servlets gemaakt die een lookup doen naar een bean aan de server zijde. Deze beans (aan de server zijde) hebben een (@) Annotation met @Remote en een mappedname waarop de bean luisterd. Zie afbeelding hieronder.\\\\
\includegraphics[scale=1]{productbean}\\\\
Als de gebruiker succesvol ingelogd is dan wordt er eenmalig een lookup gedaan naar de winkelwagenbean en die wordt in een httpsessie opgeslagen.\\

Om een lookup te kunnen doen moet de client wel weten waar de server staat. Dit is aangegeven in de 'glassfish-jndi.properties'. Hierin staat de url 'org.omg.CORBA.ORBInitialHost=localhost:9090/EJBserver'.\\\\
Een lookup is gaat op de manier hieronder:\\\\
\includegraphics[scale=1]{lookup}\\
\\
In onze implementatie kent de client ook een aantal objecten die aan de server zijde de entities zijn. Dit omdat de client anders geen gebruik kan maken van die objecten.





\newpage
\section{Testcases}
Tijdens het testen is gebleken dat dit niet zo makkelijk gaat. Bij het maken van een testcase kwamen we er achter dat je niet zomaar een Session bean kon testen. Al helemaal niet 1 die gebruik maakt van de entitymanager om een query uit te voeren. Na een google search kwamen we op ejb3Unit. Een EJB Junit versie. Helaas kregen we deze niet werkend. 
Dat de cli\"ent werkt met de server is ook al een test op zichzelf. Door de vele fouten die we tijdens de ontwikkeling tegen kwamen en deze wisten op te lossen werken de systemen samen en kan alles gedaan worden wat gedaan moet worden. 



\newpage
\section{Gebruikershandleiding}
Bij het opstarten van de client verschijnt de volgende pagina. Hierop kan de klant inloggen met zijn / haar gebruikersnaam. \\
\includegraphics[scale=0.75]{inloggen}\\
Als er nog geen klant bestaat kan er via de onderstaande pagina worden aangemeld als nieuwe klant.\\
\includegraphics[scale=0.75]{aanmelden}\\
Op de onderstaande pagina is de pagina te zien waar de klant op terecht komt als deze ingelogd is.\\
\includegraphics[scale=0.75]{ingelogd}\\
Op de onderstaande afbeelding zijn de klantgegevens te zien van een ingelogde klant.\\
\includegraphics[scale=0.75]{klantgegevens}
%huidige producten bekijken
\newpage
Via het onderstaande scherm kan een klant de productcatalogus bekijken en via de bestel knop een product bestellen.\\
\includegraphics[scale=0.75]{producten}\\
Naast de bovenstaande pagina met alle producten kan er ook geklikt worden op producten uit een bepaalde categorie. Hieronder is als voorbeeld de categorie hardware genomen.\\
\includegraphics[scale=0.75]{hardwareproducten}\\
%winkelwagen bestellen
Als er op de bestelknop geklikt is wordt de klant doorgestuurd na de winkelwagen pagina. Op deze pagina kan de klant de winkelwagen legen of kan de bestelling doorgevoerd worden.\\
\includegraphics[scale=0.75]{winkelwagen}\\
Als de bestelling voltooid is verschijnt er een bevestiging.\\
\includegraphics[scale=0.75]{voltooid}\\
%bestelgeschiedenis bekijken
Via de onderstaande pagina kan een klant zijn of haar bestelgeschiedenis bekijken. \\
\includegraphics[scale=0.75]{geschiedenis}\\

\newpage
\section{Persoonlijke bevindingen}
\subsection{Bevindingen Pleun Willemsen}
%EJB was duidelijk en te begrijpen. maar toen JPA in het spel kwam werkte het niet meer.. meerdere manieren geprobeerd
De opdracht begon gesmeerd. Al snel hadden we glassfish met daarin een EJB container draaiend. Eerst manipuleerde we de database doormiddel van prepared statements. Later kregen we te horen van de een persistence framework moesten gebruiken. Toen hebben we voor JPA gekozen. Het implementeren van JPA ging niet makkelijk. De oplossing wie wij bedacht hadden werkte niet. Daarom zijn we naar de docent gegaan om hulp te vragen. Hij liet ons een begrijpelijk oplossing zien, maar toen wij deze wouden implementeren liepen we echter weer tegen foutmeldingen aan. De huidige implementatie kent aan de client kant de objecten product, klant en bestelling. Dit zijn aan de server zijde de entities.\\
Het was wel een leerzame opdracht, voornamelijk EJB. Maar JPA ben ik nog geen fan van.


\subsection{Bevindingen Walter Ebbers}
Mijn persoonlijke bevindingen zijn positief en negatief. het positieve was dat EJB een duidelijk systeem was. Verder is het werken met beans ook goed te doen. Het negatieve aan de opdracht vond ik JPA. We hadden eerst de opdracht met DAO's uitgewerkt omdat we het niet duidelijk vonden dat JPA gebruikt moest worden. In de opdrachtomschrijving werd niet expliciet genoemd dat JPA gebruikt moest worden. Nadat we te horen kregen dat we JPA moesten gebruiken begonnen de problemen. We kregen JPA eerst niet aan de praat met de entities en de queries hiervoor. Na een grote hoeveelheid tijd verkloot te hebben, zijn we na de docent gegaan voor hulp. Hier kwam een begrijpelijke oplossing uit alleen werkte deze niet zoals we gehoopt hadden. Uiteindelijk  hebben we er voor gekozen om de entitie classes ook in de client neer te zetten maar dan zonder de database waarden zoals column names en table mapping.
Aan de hand van serialisation nummers werden de classes bij binnenkomst goed gecast na de juiste classe en konden we ook snel verder. Uiteindelijk hebben we het voor elkaar gekregen om de implementatie werkend te krijgen. Helaas heeft mijn ervaring met JPA er wel voor gezorgd dat ik er waarschijnlijk in de toekomst niet meer mee zal werken. Ik vind het gebruik van een directe link na de database met prepared statements en het gebruik van LINQ toch fijner. En zelf vind ik ook dat je met prepared statements en LINQ veel sneller serverside code kan schrijven om mee te werken. 


\newpage
\section{Bronnen}
\begin{itemize}
	\item Roosindia.net - EJB 3.0 - http://www.roseindia.net/ejb/
	\item Colleges Enterprise Application
\end{itemize}

\end{document}
